{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "527cb613-d251-41b3-aa4c-ae37a898cea8",
   "metadata": {},
   "source": [
    "# 环境配置\n",
    "## 环境管理与包安装\n",
    "其中 mamba == conda 两者接口一致，但 mamba 比 conda 更快，建议使用 mamba 管理环境安装依赖可以从 [https://conda-forge.org/miniforge/](https://conda-forge.org/miniforge/) 下载安装（建议使用 Miniforge）。\n",
    "\n",
    "## 依赖库\n",
    "```shell\n",
    "mamba create -n metgrs python==3.11 numpy pandas xarray matplotlib joblib python-dateutil cartopy -c conda-forge -y\n",
    "```\n",
    "\n",
    "## jupyter lab 运行环境安装\n",
    "\n",
    "```shell\n",
    "mamba create -n runtime python==3.11 jupyterlab jupyterlab-lsp python-lsp-server jupyterlab-language-pack-zh-cn jupyterlab-git nb_conda -c conda-forge -y\n",
    "```\n",
    "## 开发环境安装\n",
    "\n",
    "```shell\n",
    "mamba create -n devmetgrs python==3.11 numpy xarray pandas geopandas scipy dask metpy matplotlib cartopy cnmaps sympy  nb_conda scikit-learn pytest pytest-cov pytest-xdist flake8 black pre-commit build twine -c conda-forge -y\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85dd1b6f-1293-46fb-a9ed-8269fd607304",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "689c11c3-b876-4af5-a9b9-2a05e898b9d5",
   "metadata": {},
   "source": [
    "# 中文绘图配置\n",
    "## 示例\n",
    "![](./Images/missing-chinese-font-example.png)\n",
    "## 基础包安装"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e90dcde3-8a4c-4e9b-9375-0a6af687b18b",
   "metadata": {},
   "source": [
    "cartopy 地理边界与中文字体包\n",
    "```bash\n",
    "conda install cartopy_offlinedata -c conda-forge -y\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ebfb8f71-274b-48b9-b25a-0d3c7045244d",
   "metadata": {},
   "source": [
    "## 临时设置中文字体"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "14dcbf3e-d037-43b7-91fe-ae4df19ecd24",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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S+np6SX2feONN9SyZUvZ7XaFhYVp165d5VwxAACozHw8XYAkxcXFKT4+XnPnzlWdOnU0ZMgQRUdH66uvvirS9/nnn9fbb7+t6dOnKyIiQvv371eNGjU8UDUAAKisvIwxxpMFOBwO1a9fX88++6zGjBkjSVq2bJl69uyplJQUNW3a1Nl3165duu6667Rq1SpFRUVd1OdlZWUpKChImZmZCgwMdMs+AACAy8vd398ePwW2fft2ZWRkqGfPns62qKgo2Ww2JSUlufSdP3++brzxxosOPwAAAFIFCEApKSmS5DLS4+/vr3r16iktLc2lb1JSkm644QY9+eSTuuKKK9SiRQvNmDFD5xvEys3NVVZWlssLAABYm8cD0MmTJ2Wz2WS3213aAwIClJub69L222+/aenSpapWrZq++uorxcTE6JlnntG8efNK3H5sbKyCgoKcr9DQ0MuyHwAAoPLweACy2+1yOBwqKChwac/JyVFAQIBLW0FBga699lrFxsaqXbt2GjNmjHr16qX58+eXuP3x48crMzPT+UpNTb0s+wEAACoPjwegkJAQSXI53ZWbm6v09HQ1a9bMpe8VV1yhq666yqWtRYsWOnLkSInbt9vtCgwMdHkBAABr83gAioiIkL+/v1auXOlsS0xMlJeXlyIjI136duzYscjE6J07d6pFixblUisAAKgaPB6A/P39FRMTo4kTJ2r58uVau3atRo8erWHDhik4OFg9evTQJ598Ikl67LHHtH//fj3++OPavHmz4uLi9MUXX+jJJ5/08F4AAIDKpELcCHHKlCnKzs5Wv3795O3trQEDBiguLk75+flKTk7WoUOHJJ25Uuyrr77SE088odmzZys8PFwLFixQp06dPLwHAACgMvH4jRDLGzdCBACg8qlyN0IEAAAobwQgAABgOQQgAABgOQQgAABgOQQgAABgORXiMngAqMp+++037dy5U5IUFRUlX19fD1cEgBEgALjMli9frm7duqlbt27KzMz0dDmXVefOndWuXTu9+uqrni4FOC8CEABUEi+++KK8vLwu6+uf//znRdeXn5+vxMREbdq0SSdPnnTfjgOXAQEIAOAW6enpzp/r1q3rwUqAC2MOEABUMnfffbcWLVrk1m3efvvt+u677y5pG+cGoAYNGlxqScBlRQACgErGZrPJz8/P7du8VIcPH3b+3LRp00veHnA5EYAA4CKcPn1aR48eLVXfY8eOOX/+7bfflJOTU6r1GjZsKG9v74uqzxPOXukmEYBQ8RGAAOAiLFq0SIMGDSrzejfccEOp+x44cEDh4eElvv/888/r9ddfL3MN54qNjVVMTMwlbeOsrVu3On/+448/FBwc7JbtApcDAQgAKqns7OxLvqw+NzfXTdW4BqCvv/5aI0eOdNu2AXfjKjAAuAR2u13GmPO+5syZ4+yfnp5+3r4bNmwo9WdPnz69xO3s3bu3VPU98cQTbvk95OTkKDk52bn89ddfu2W7wOVCAAIAXLJVq1YpLy/PubxmzRruBYQKjQAEALhkS5culSRVq1ZNzZo1U3Z2thYvXuzhqoCSEYAAAJfsbADq0qWLBgwYIEkup/6AioYABACVWEmPtGjevLmkM5OcS+pz1VVXuaWG77//XmlpaZKke++9V3379pUkfffdd9q1a5dbPgNwtzJfBdamTRtlZWWVqm9KSkqZCwIAd1i3bp3++OOPEt8PDQ1V69atJZ25mmrVqlXn3V6HDh1Up04dt9boDkFBQcW2OxwOnThx4rx9AgMD3VLD2eeH+fr6qnfv3qpfv77atGmjLVu26JVXXtHcuXPd8jmAO5U5AP3888/asmWLJMkYo7Zt22rz5s3O940xat26tbZt2+a2IgGgrMaPH6/ExMQS34+OjnZ+MR85ckR33333ebe3Zs0ade7c2Y0Vusfx48eLbd+3b5+aN28uu93u7JOcnCxvb2+1aNHCbZ9/8OBBffbZZ5LOjP7Ur19fkvTYY49p6NChev/99/XCCy9wY0RUOGUOQF5eXmrSpIlz2dvb22W5pDYAqIrOnmIqrXr16l3Gakr27bffqnv37qpVq5bWrFmjli1bumW7M2bMUGFhoSRp+PDhzvaHHnpIf//733X8+HG98MILmj9/vls+D3CXUgWgpk2bOv/As7Ky1KxZM+d7x44dc1k2xri5RAAou4SEhFL3DQ8Pr/L/dnXq1Em9e/fWggULdNttt+mHH35QaGjoJW1z27ZtmjVrliSpffv26tq1q/O9gIAAPfHEE3rxxRf13nvvadCgQerSpcslfR7gTqUKQElJSZLOhJtWrVpp3bp1zuXrrrvOuXy27ZprrrkMpQJAxWO327Vv377z9lm8eLHGjh0r6UxoqFWrVol9t23bpjvvvNOtNUpnHnY6d+5cHT58WOvWrdPatWv1wAMPXPT2jDEaPny4CgoKJEmTJ08u0mfs2LF6/fXX9ccff2j48OHaunWr2x/iClysUgWgs+d0pTN/ROdbBgArqF69ukJCQuTn56fGjRuft++5gadhw4aqW7duiX2PHj2qkJAQSZKPj3ufVuTr66uPP/5Yhw8fVqtWrS5pW2+++abzf3579Oihbt26FelTs2ZNTZw4UaNHj9aePXs0fPhwJkSjwijzX5cxxnnKyxijo0ePupwCk6TMzEw1a9aMq8AAVFl9+/Z1Xu7tTjfccIPzkvILOd/DRh0Oh6Qzc5TO1y8kJMTlKe6lkZCQ4BzRql69ut56660S+44cOVLvv/++1q9fr3nz5qlt27YaNWpUmT4PuBzKFIC2bt2q5cuXO0d8Tpw4oRo1asjLy0v79u1TQECAGjVqdFkKBQC4Ku2DUM/Xr0aNGmX6zJSUFPXp00f5+fmSpGnTpp33ifU2m03vvPOObrrpJuXm5mrMmDGqXbu2HnrooTJ9LuBuZboR4osvvqh9+/apSZMmatKkiV566SXVqVNHTZo00caNGzVnzhzne1wFBgCX14UewlqaV2lHmyRp//79uv322533VxowYIAee+yxC653/fXXa+bMmZKkwsJCPfzww3r33XcvbqcBN7ngCFBBQYHmz5+v7t27O9umTZum9957T6mpqerQoYNsNpuOHj2qkydPKikpScYYeXl5acWKFWrQoMFl3QEAwOW3adMm3XHHHfr9998lSTfffLP+/e9/l3r9Rx55RJs3b9abb74ph8OhIUOGaMuWLZo+fbrsdvvlKhso0QVHgDIzM/Xll1+qdevW+vrrr/X111+rc+fO+uijj3TLLbdo7ty5Wrx4sWbOnCmbzabFixfro48+0uLFiz12vwsAgPssWrRInTt3doafG2+8UcuWLZO/v3+ZthMfH6+HH37YufzGG2+oQ4cOWr9+vVvrBUrjgiNAderU0ccffyxjjDP9//Wvf1WLFi10+PBhtWjRQoGBgWrYsKEyMzNVr1491a5duzxqBwBL+vzzz8t088WLlZGRoREjRmjRokXOto4dO+qLL74476X8JbHZbJozZ478/Pyco0c//vij2rdvr759++qdd95x2+M5gAsp9RwgLy8vtW7dWk8++aRSUlI0duxYde7c2Tl0GRgYqCuvvFK7d+/W4MGDnbdG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3v39/RUcHKyaNWvKZrMpODhYXl5eCg0NVUZGhnbu3On8efPmzR7bNwCeRwACUCEFBwdr6NChRdpfeuklbdmyRa+88or69OmjLVu2OK8Ok6TMzEzt2bNHx44dU2xsrPbt21eeZQOoJJgDBKBCmjlzpry9vYu0P/fcc5o+fbocDoccDoeuu+465xyg5s2ba9++fQoKCpLD4dD+/fsVFRXlgeoBVHQEIAAVUnHh59FHH9Vjjz2mb775Rr169VLt2rUVGxur/v3768iRI/Lz81NYWJgyMjLUp08fvfPOO8zxAVAsToEBqBRycnK0YsUKRUVFaenSpTp16pTy8vJ0/PhxtW3bVp988onCwsJcnhN21i+//KLg4GC1atVKx48fV3BwsG644QYP7AWAioIABKBSWL9+vebNm6f58+dryZIlCg8Pl7+/v6ZPn65NmzZp//79+uyzz4pdNywsTMePH3d5cQdowNq4DB5AlZOfn6/09HQ1atTI06UAqKAIQAAAwHI4BQYAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACzn/wFcHp8Kv1xCYwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# -*- coding: utf-8 -*-\n",
    "\"\"\"\n",
    "让 Matplotlib 立即使用 Conda 安装的 Noto Sans CJK （Windows/Linux/macOS 通用）\n",
    "\"\"\"\n",
    "import os\n",
    "import matplotlib\n",
    "import matplotlib.font_manager as fm\n",
    "from pathlib import Path\n",
    "\n",
    "# 1. 定位 Conda 环境的 fonts 目录\n",
    "conda_prefix = Path(os.environ.get(\"CONDA_PREFIX\", \"\"))\n",
    "if not conda_prefix:\n",
    "    raise RuntimeError(\"请激活 Conda 环境后再运行！\")\n",
    "\n",
    "# Windows 与 Unix 路径差异\n",
    "if os.name == \"nt\":          # Windows\n",
    "    fonts_dir = conda_prefix / \"fonts\"\n",
    "else:                        # Linux/macOS\n",
    "    fonts_dir = conda_prefix / \"share\" / \"fonts\"\n",
    "\n",
    "# 2. 找到 Noto CJK 字体文件（支持 .ttf/.ttc/.otf）\n",
    "noto_files = []\n",
    "for ext in (\"*.ttf\", \"*.ttc\", \"*.otf\"):\n",
    "    noto_files.extend(fonts_dir.glob(ext))\n",
    "\n",
    "noto_files = [f for f in noto_files if \"noto\" in f.name.lower() and \"cjk\" in f.name.lower()]\n",
    "if not noto_files:\n",
    "    raise FileNotFoundError(f\"在 {fonts_dir} 下找不到 Noto CJK 字体！\")\n",
    "\n",
    "# 3. 注册到 Matplotlib（只需执行一次）\n",
    "for fp in noto_files:\n",
    "    fm.fontManager.addfont(str(fp))\n",
    "\n",
    "# 4. 设置默认中文字体（用 SC，也可改成 JP/KR）\n",
    "matplotlib.rcParams['font.family'] = 'sans-serif'\n",
    "matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 与系统注册名保持一致\n",
    "matplotlib.rcParams['axes.unicode_minus'] = False              # 修复负号\n",
    "\n",
    "# 5. 验证\n",
    "import matplotlib.pyplot as plt\n",
    "fig, ax = plt.subplots()\n",
    "ax.set_title(\"中文测试：你好，世界！\")\n",
    "ax.set_xlabel(\"横轴\")\n",
    "ax.set_ylabel(\"纵轴\")\n",
    "ax.text(0.5,0.5,'--中国人',fontsize=21)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2b352d5b-1ed2-4dac-b62e-57987352d01e",
   "metadata": {},
   "source": [
    "## windows永久设置中文字体"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "4a61d334-241e-4247-bd4a-77c284a4d73a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "配置文件路径: D:\\Programs\\miniforge3\\envs\\qxfx3p11\\Lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc\n",
      "已就地修改： D:\\Programs\\miniforge3\\envs\\qxfx3p11\\Lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc\n",
      "备份文件： D:\\Programs\\miniforge3\\envs\\qxfx3p11\\Lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc.bak\n",
      "\n",
      "修改后的字体配置:\n",
      "## The font.style property has three values: normal (or roman), italic\n",
      "## The font.variant property has two values: normal or small-caps.  For\n",
      "## The font.weight property has effectively 13 values: normal, bold,\n",
      "## The font.stretch property has 11 values: ultra-condensed,\n",
      "## relative to font.size, using the following values: xx-small, x-small,\n"
     ]
    }
   ],
   "source": [
    "# -*- coding: utf-8 -*-\n",
    "\"\"\"\n",
    "就地修改当前环境里的 matplotlibrc （类似 sed -i）\n",
    "实现 Linux 下的 sed 命令功能：\n",
    "sed -i 's/DejaVu Serif,/Noto Sans CJK SC, DejaVu Serif,/g' matplotlibrc\n",
    "sed -i 's/DejaVu Sans,/Noto Sans CJK SC, DejaVu Sans,/g' matplotlibrc\n",
    "sed -i 's/Arial,//g' matplotlibrc\n",
    "\"\"\"\n",
    "import re\n",
    "import shutil\n",
    "from pathlib import Path\n",
    "import matplotlib\n",
    "\n",
    "# 1. 系统级模板文件路径\n",
    "mpl_rc = Path(matplotlib.get_data_path()) / 'matplotlibrc'\n",
    "print(f\"配置文件路径: {mpl_rc}\")\n",
    "if not mpl_rc.exists():\n",
    "    raise FileNotFoundError(f\"找不到配置文件：{mpl_rc}\")\n",
    "\n",
    "# 2. 读入全文\n",
    "text = mpl_rc.read_text(encoding='utf-8')\n",
    "\n",
    "# 3. 优化：先移除已存在的 Noto Sans CJK SC 避免重复\n",
    "text = re.sub(r'Microsoft YaHei,\\s*', '', text, flags=re.IGNORECASE)\n",
    "\n",
    "# 4. 正确实现 sed 替换（针对字体列表中的特定字符串）\n",
    "# 替换 DejaVu Serif 为 Noto Sans CJK SC, DejaVu Serif\n",
    "text = re.sub(r'(\\bDejaVu Serif,\\s*)', r'Microsoft YaHei, \\1', text, flags=re.IGNORECASE)\n",
    "# 替换 DejaVu Sans 为 Noto Sans CJK SC, DejaVu Sans\n",
    "text = re.sub(r'(\\bDejaVu Sans,\\s*)', r'Microsoft YaHei, \\1', text, flags=re.IGNORECASE)\n",
    "\n",
    "# 5. 移除 Arial 字体（处理所有位置的 Arial,）\n",
    "text = re.sub(r'Arial,\\s*', '', text, flags=re.IGNORECASE)\n",
    "\n",
    "# 6. 修复可能的多余逗号和空格\n",
    "text = re.sub(r',\\s*,', ',', text)\n",
    "text = re.sub(r',\\s+$', '', text)  # 移除行尾多余逗号\n",
    "\n",
    "# 7. 写回（先备份）\n",
    "bak = mpl_rc.with_suffix('.bak')\n",
    "if not bak.exists():               # 只备份一次\n",
    "    shutil.copy2(mpl_rc, bak)\n",
    "mpl_rc.write_text(text, encoding='utf-8')\n",
    "\n",
    "print(\"已就地修改：\", mpl_rc)\n",
    "print(\"备份文件：\", bak)\n",
    "\n",
    "# 验证修改结果\n",
    "print(\"\\n修改后的字体配置:\")\n",
    "lines = text.split('\\n')\n",
    "font_lines = [line for line in lines if 'font.' in line.lower() and ':' in line]\n",
    "for line in font_lines[:5]:  # 显示前5行字体相关配置\n",
    "    print(line)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "5d873a5d-f2e5-4c3d-8c21-908ecde15048",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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S+np6SX2feONN9SyZUvZ7XaFhYVp165d5VwxAACozHw8XYAkxcXFKT4+XnPnzlWdOnU0ZMgQRUdH66uvvirS9/nnn9fbb7+t6dOnKyIiQvv371eNGjU8UDUAAKisvIwxxpMFOBwO1a9fX88++6zGjBkjSVq2bJl69uyplJQUNW3a1Nl3165duu6667Rq1SpFRUVd1OdlZWUpKChImZmZCgwMdMs+AACAy8vd398ePwW2fft2ZWRkqGfPns62qKgo2Ww2JSUlufSdP3++brzxxosOPwAAAFIFCEApKSmS5DLS4+/vr3r16iktLc2lb1JSkm644QY9+eSTuuKKK9SiRQvNmDFD5xvEys3NVVZWlssLAABYm8cD0MmTJ2Wz2WS3213aAwIClJub69L222+/aenSpapWrZq++uorxcTE6JlnntG8efNK3H5sbKyCgoKcr9DQ0MuyHwAAoPLweACy2+1yOBwqKChwac/JyVFAQIBLW0FBga699lrFxsaqXbt2GjNmjHr16qX58+eXuP3x48crMzPT+UpNTb0s+wEAACoPjwegkJAQSXI53ZWbm6v09HQ1a9bMpe8VV1yhq666yqWtRYsWOnLkSInbt9vtCgwMdHkBAABr83gAioiIkL+/v1auXOlsS0xMlJeXlyIjI136duzYscjE6J07d6pFixblUisAAKgaPB6A/P39FRMTo4kTJ2r58uVau3atRo8erWHDhik4OFg9evTQJ598Ikl67LHHtH//fj3++OPavHmz4uLi9MUXX+jJJ5/08F4AAIDKpELcCHHKlCnKzs5Wv3795O3trQEDBiguLk75+flKTk7WoUOHJJ25Uuyrr77SE088odmzZys8PFwLFixQp06dPLwHAACgMvH4jRDLGzdCBACg8qlyN0IEAAAobwQgAABgOQQgAABgOQQgAABgOQQgAABgORXiMngAqMp+++037dy5U5IUFRUlX19fD1cEgBEgALjMli9frm7duqlbt27KzMz0dDmXVefOndWuXTu9+uqrni4FOC8CEABUEi+++KK8vLwu6+uf//znRdeXn5+vxMREbdq0SSdPnnTfjgOXAQEIAOAW6enpzp/r1q3rwUqAC2MOEABUMnfffbcWLVrk1m3efvvt+u677y5pG+cGoAYNGlxqScBlRQACgErGZrPJz8/P7du8VIcPH3b+3LRp00veHnA5EYAA4CKcPn1aR48eLVXfY8eOOX/+7bfflJOTU6r1GjZsKG9v74uqzxPOXukmEYBQ8RGAAOAiLFq0SIMGDSrzejfccEOp+x44cEDh4eElvv/888/r9ddfL3MN54qNjVVMTMwlbeOsrVu3On/+448/FBwc7JbtApcDAQgAKqns7OxLvqw+NzfXTdW4BqCvv/5aI0eOdNu2AXfjKjAAuAR2u13GmPO+5syZ4+yfnp5+3r4bNmwo9WdPnz69xO3s3bu3VPU98cQTbvk95OTkKDk52bn89ddfu2W7wOVCAAIAXLJVq1YpLy/PubxmzRruBYQKjQAEALhkS5culSRVq1ZNzZo1U3Z2thYvXuzhqoCSEYAAAJfsbADq0qWLBgwYIEkup/6AioYABACVWEmPtGjevLmkM5OcS+pz1VVXuaWG77//XmlpaZKke++9V3379pUkfffdd9q1a5dbPgNwtzJfBdamTRtlZWWVqm9KSkqZCwIAd1i3bp3++OOPEt8PDQ1V69atJZ25mmrVqlXn3V6HDh1Up04dt9boDkFBQcW2OxwOnThx4rx9AgMD3VLD2eeH+fr6qnfv3qpfv77atGmjLVu26JVXXtHcuXPd8jmAO5U5AP3888/asmWLJMkYo7Zt22rz5s3O940xat26tbZt2+a2IgGgrMaPH6/ExMQS34+OjnZ+MR85ckR33333ebe3Zs0ade7c2Y0Vusfx48eLbd+3b5+aN28uu93u7JOcnCxvb2+1aNHCbZ9/8OBBffbZZ5LOjP7Ur19fkvTYY49p6NChev/99/XCCy9wY0RUOGUOQF5eXmrSpIlz2dvb22W5pDYAqIrOnmIqrXr16l3Gakr27bffqnv37qpVq5bWrFmjli1bumW7M2bMUGFhoSRp+PDhzvaHHnpIf//733X8+HG98MILmj9/vls+D3CXUgWgpk2bOv/As7Ky1KxZM+d7x44dc1k2xri5RAAou4SEhFL3DQ8Pr/L/dnXq1Em9e/fWggULdNttt+mHH35QaGjoJW1z27ZtmjVrliSpffv26tq1q/O9gIAAPfHEE3rxxRf13nvvadCgQerSpcslfR7gTqUKQElJSZLOhJtWrVpp3bp1zuXrrrvOuXy27ZprrrkMpQJAxWO327Vv377z9lm8eLHGjh0r6UxoqFWrVol9t23bpjvvvNOtNUpnHnY6d+5cHT58WOvWrdPatWv1wAMPXPT2jDEaPny4CgoKJEmTJ08u0mfs2LF6/fXX9ccff2j48OHaunWr2x/iClysUgWgs+d0pTN/ROdbBgArqF69ukJCQuTn56fGjRuft++5gadhw4aqW7duiX2PHj2qkJAQSZKPj3ufVuTr66uPP/5Yhw8fVqtWrS5pW2+++abzf3579Oihbt26FelTs2ZNTZw4UaNHj9aePXs0fPhwJkSjwijzX5cxxnnKyxijo0ePupwCk6TMzEw1a9aMq8AAVFl9+/Z1Xu7tTjfccIPzkvILOd/DRh0Oh6Qzc5TO1y8kJMTlKe6lkZCQ4BzRql69ut56660S+44cOVLvv/++1q9fr3nz5qlt27YaNWpUmT4PuBzKFIC2bt2q5cuXO0d8Tpw4oRo1asjLy0v79u1TQECAGjVqdFkKBQC4Ku2DUM/Xr0aNGmX6zJSUFPXp00f5+fmSpGnTpp33ifU2m03vvPOObrrpJuXm5mrMmDGqXbu2HnrooTJ9LuBuZboR4osvvqh9+/apSZMmatKkiV566SXVqVNHTZo00caNGzVnzhzne1wFBgCX14UewlqaV2lHmyRp//79uv322533VxowYIAee+yxC653/fXXa+bMmZKkwsJCPfzww3r33XcvbqcBN7ngCFBBQYHmz5+v7t27O9umTZum9957T6mpqerQoYNsNpuOHj2qkydPKikpScYYeXl5acWKFWrQoMFl3QEAwOW3adMm3XHHHfr9998lSTfffLP+/e9/l3r9Rx55RJs3b9abb74ph8OhIUOGaMuWLZo+fbrsdvvlKhso0QVHgDIzM/Xll1+qdevW+vrrr/X111+rc+fO+uijj3TLLbdo7ty5Wrx4sWbOnCmbzabFixfro48+0uLFiz12vwsAgPssWrRInTt3doafG2+8UcuWLZO/v3+ZthMfH6+HH37YufzGG2+oQ4cOWr9+vVvrBUrjgiNAderU0ccffyxjjDP9//Wvf1WLFi10+PBhtWjRQoGBgWrYsKEyMzNVr1491a5duzxqBwBL+vzzz8t088WLlZGRoREjRmjRokXOto4dO+qLL74476X8JbHZbJozZ478/Pyco0c//vij2rdvr759++qdd95x2+M5gAsp9RwgLy8vtW7dWk8++aRSUlI0duxYde7c2Tl0GRgYqCuvvFK7d+/W4MGDnbdG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3v39/RUcHKyaNWvKZrMpODhYXl5eCg0NVUZGhnbu3On8efPmzR7bNwCeRwACUCEFBwdr6NChRdpfeuklbdmyRa+88or69OmjLVu2OK8Ok6TMzEzt2bNHx44dU2xsrPbt21eeZQOoJJgDBKBCmjlzpry9vYu0P/fcc5o+fbocDoccDoeuu+465xyg5s2ba9++fQoKCpLD4dD+/fsVFRXlgeoBVHQEIAAVUnHh59FHH9Vjjz2mb775Rr169VLt2rUVGxur/v3768iRI/Lz81NYWJgyMjLUp08fvfPOO8zxAVAsToEBqBRycnK0YsUKRUVFaenSpTp16pTy8vJ0/PhxtW3bVp988onCwsJcnhN21i+//KLg4GC1atVKx48fV3BwsG644QYP7AWAioIABKBSWL9+vebNm6f58+dryZIlCg8Pl7+/v6ZPn65NmzZp//79+uyzz4pdNywsTMePH3d5cQdowNq4DB5AlZOfn6/09HQ1atTI06UAqKAIQAAAwHI4BQYAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACyHAAQAACzn/wFcHp8Kv1xCYwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "fig, ax = plt.subplots()\n",
    "ax.set_title(\"中文测试：你好，世界！\")\n",
    "ax.set_xlabel(\"横轴\")\n",
    "ax.set_ylabel(\"纵轴\")\n",
    "ax.text(0.5,0.5,'--中国人',fontsize=21)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9817d88d-5536-40a5-9347-306d0c0bf983",
   "metadata": {},
   "source": [
    "## Linux 下永久配置中文字体\n",
    "```bash\n",
    "conda install  font-ttf-noto-cjk -c conda-forge -y\n",
    "pip install mplfonts\n",
    "mplfonts init\n",
    "# 注意qxfx是您配置的环境名称，python3.11 是您环境的python版本，这两个文件夹需要您手动修改\n",
    "sed -i 's/DejaVu Serif,/Noto Sans CJK SC, DejaVu Serif,/g' /opt/conda/envs/qxfx/lib/python3.11/site-packages/matplotlib/mpl-data/matplotlibrc\n",
    "sed -i 's/DejaVu Sans,/Noto Sans CJK SC, DejaVu Sans,/g' /opt/conda/envs/qxfx/lib/python3.11/site-packages/matplotlib//mpl-data/matplotlibrc\n",
    "sed -i 's/Arial,//g' /opt/conda/envs/qxfx/lib/python3.11/site-packages/matplotlib/mpl-data/matplotlibrc\n",
    "rm -f -r ~/.cache/matplotlib\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "235dced7-445c-4e51-9c10-4dd89f850f8f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "4b337fcc-f4be-41a6-9b52-d42b1301959d",
   "metadata": {},
   "source": [
    "# jupyter 如何添加环境\n",
    "\n",
    "## 方法一\n",
    "\n",
    "```\n",
    "conda install nb_conda -c conda-forge -y\n",
    "```\n",
    "\n",
    "## 方法二\n",
    "```\n",
    "python -m ipykernel install --user --name qxfx --display-name \"Python (qxfx)\"\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b5660df6-ca33-4d14-a114-33f1937acdfa",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "30c4e385-64d5-4d4b-ac85-cd5f511675d6",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:qxfx3p11]",
   "language": "python",
   "name": "conda-env-qxfx3p11-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
